<?php
require './function.php';
/**
 * @Author: Wherein
 * @Date: 2021-03-30 22:45
 * @Descripttion: 外观模式/门面模式
 * @example 没有挂号系统的话, 1 去医生系统通知医生 2 去患者系统取一下患者资料交给医生  3 去药品系统登记一下 4 最后到药房领药
 */

// 医院医生员工系统
class DoctorSystem
{
    static public function getDoctor($name)
    {
        dd(__CLASS__ . ":" . $name . '医生,挂你号');
        return new Doctor($name);
    }
}

class Doctor
{
    public $name;
    public function __construct($name)
    {
        $this->name = $name;
    }
    public function prescribe($data)
    {
        dd('开个处方给你');
        return '药到病除';
    }
}

// 患者系统
class SufferSystem
{
    static function getData($suffer)
    {
        $data = $suffer . '资料';
        dd(__CLASS__ . ':' . $suffer . '的资料是这些');
        return $data;
    }
}

// 医药系统
class MedicineSystem
{
    static function register($prescribe)
    {
        dd(__CLASS__ . ':' . '拿到处方') . $prescribe;
        Shop::setMedicine('砒霜5千克');
    }
}

// 药房
class Shop
{
    static public $medicine;
    static function setMedicine($medicine)
    {
        self::$medicine = $medicine;
    }
    static function getMedicine()
    {
        dd(__CLASS__ . ':' . self::$medicine);
    }
}

// 如果没有挂号, 就诊的第一步
// 通知就诊医生
$doct = DoctorSystem::getDoctor('白医生');
// 患者系统拿病历资料
$data = SufferSystem::getData('小杨');
// 医生看病历资料, 开处方
$prescribe = $doct->prescribe($data);
// 医药系统登记处方
MedicineSystem::register($prescribe);
// 药方拿药
Shop::getMedicine();

dd('有了挂号系统后');

class Facade
{
    static public function regist($suffer, $doct)
    {
        // 通知就诊医生
        $doct = DoctorSystem::getDoctor($doct);
        // 患者系统拿病历资料
        $data = SufferSystem::getData($suffer);
        // 医生看病历资料, 开处方
        $prescribe = $doct->prescribe($data);
        // 医药系统登记处方
        MedicineSystem::register($prescribe);
        // 药方拿药
        Shop::getMedicine();
    }
}

// 患者只需要挂一个号
Facade::regist('wherein', '白医生');
